import os
import os.path
from lxml import etree
from PIL import Image

from . import utils

class Media:
    def __init__(self, id, path):
        """
        初始化 Media 对象。

        :param id: 媒体资源的 ID。
        :param path: 媒体资源的路径。
        """
        self.path = self.alt_path = path
        self.id = id
        self.use_alt = False
        self.check_alt(path)

    def check_alt(self, path):
        """
        检查是否需要使用备用路径。

        :param path: 媒体资源的路径。
        """
        base, ext = os.path.splitext(path)
        if ext.lower() not in ".png.gif.bmp.jpg.jpeg".split():
            self.use_alt = True
            self.alt_path = base + ".png"

    def __repr__(self):
        """
        返回 Media 对象的字符串表示形式。
        """
        return f"Media(id={self.id}, path={self.path}, alt_path={self.alt_path}, use_alt={self.use_alt})"

class DocxMedia:
    def __init__(self, docx):
        """
        初始化 DocxMedia 对象。

        :param docx: 代表一个.docx 文件的对象。
        """
        self.docx = docx
        self.hash = {}
        root = etree.fromstring(docx.rels())
        utils.strip_ns_prefix(root)
        self.parse_tree(root)

    def parse_tree(self, root):
        """
        解析 XML 树以提取媒体资源信息。

        :param root: XML 树的根节点。
        """
        for tag in root.xpath("//Relationship"):
            path = tag.attrib.get("Target")
            if not path:
                continue
            if not path.startswith("media/"):
                continue
            id = tag.attrib.get("Id")
            if id:
                self.hash[id] = Media(id, path)

    def __len__(self):
        """
        返回媒体资源的数量。
        """
        return len(self.hash)

    def __contains__(self, id):
        """
        检查给定的 ID 是否在媒体资源字典中。

        :param id: 媒体资源的 ID。
        """
        return id in self.hash

    def __getitem__(self, id):
        """
        通过 ID 获取媒体资源对象。

        :param id: 媒体资源的 ID。
        """
        return self.hash.get(id)

    def get(self, id):
        """
        与 __getitem__ 方法类似，通过 ID 获取媒体资源对象。

        :param id: 媒体资源的 ID。
        """
        return self.hash.get(id)

    def save(self, images_folder):
        """
        将媒体资源保存到指定的图片文件夹中。

        :param images_folder: 图片文件夹路径。
        """
        os.makedirs(images_folder, exist_ok=True)
        for media in self.hash.values():
            file_path = os.path.join(images_folder, os.path.basename(media.path))
            with open(file_path, "wb") as f:
                save_img_path=self.docx.read("word/" + media.path)
                f.write(save_img_path)
            # if media.use_alt:
            #     alt_file_path = os.path.join(images_folder, os.path.basename(media.alt_path))
            #     print("# convert", media.path, "to", media.alt_path)
            #     try:
            #         im = Image.open(file_path)
            #         im.save(alt_file_path)
            #         os.unlink(file_path)
            #     except Exception as e:
            #         print(f"# failed to convert {media.path} to {media.alt_path}: {e}")


# if __name__ == "__main__":

